{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "data65\r\n"
     ]
    }
   ],
   "source": [
    "# 查看当前挂载的数据集目录\n",
    "!ls /home/aistudio/data/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# 查看个人持久化工作区文件\n",
    "!ls /home/aistudio/work/"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/\n",
      "Collecting torch\n",
      "\u001b[?25l  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/59/d2/4e806f73b4b72daab9064c99394fc22ea6ef1fb052154546405057cd192d/torch-1.0.1.post2-cp35-cp35m-manylinux1_x86_64.whl (582.5MB)\n",
      "\u001b[K    100% |████████████████████████████████| 582.5MB 73kB/s  eta 0:00:014.0MB/s eta 0:00:14[K    0% |▎                               | 4.9MB 52.3MB/s eta 0:00:12[K    1% |▍                               | 7.3MB 45.7MB/s eta 0:00:13                     | 10.9MB 51.4MB/s eta 0:00:12.1MB 55.1MB/s eta 0:00:11.0MB 53.6MB/s eta 0:00:11.5MB 54.1MB/s eta 0:00:11111210100:16               | 38.6MB 53.1MB/s eta 0:00:11                         | 41.8MB 52.7MB/s eta 0:00:11    | 43.9MB 44.9MB/s eta 0:00:12| 46.6MB 31.9MB/s eta 0:00:17                         | 49.5MB 55.2MB/s eta 0:00:10                         | 52.5MB 50.7MB/s eta 0:00:11                         | 55.7MB 56.5MB/s eta 0:00:10.1MB 55.0MB/s eta 0:00:10                     | 60.7MB 55.9MB/s eta 0:00:10             | 65.4MB 48.0MB/s eta 0:00:11.1MB/s eta 0:00:10% |████                            | 71.3MB 58.1MB/s eta 0:00:09 0:00:11   | 76.3MB 44.6MB/s eta 0:00:12                   | 78.4MB 37.5MB/s eta 0:00:14                   | 80.9MB 58.8MB/s eta 0:00:09 eta 0:00:13    14% |████▊                           | 86.2MB 57.8MB/s eta 0:00:090:00:10MB/s eta 0:00:09��▏                          | 93.5MB 56.9MB/s eta 0:00:09             | 97.9MB 52.2MB/s eta 0:00:109209000:09                 | 117.0MB 53.3MB/s eta 0:00:0900:11                 | 121.7MB 60.2MB/s eta 0:00:08                 | 124.0MB 52.4MB/s eta 0:00:0900:0900:1010110909080:09                | 151.8MB 33.9MB/s eta 0:00:13                | 154.3MB 56.6MB/s eta 0:00:08                | 156.8MB 30.4MB/s eta 0:00:15                | 160.2MB 46.0MB/s eta 0:00:10                | 161.8MB 27.6MB/s eta 0:00:16                | 164.1MB 50.1MB/s eta 0:00:09   28% |█████████▏                      | 167.1MB 51.2MB/s eta 0:00:09   29% |█████████▎                      | 169.3MB 51.7MB/s eta 0:00:08   29% |█████████▍                      | 171.7MB 48.2MB/s eta 0:00:09   29% |█████████▋                      | 174.1MB 45.5MB/s eta 0:00:09   30% |█████████▊                      | 176.5MB 56.3MB/s eta 0:00:08�████████▉                      | 178.8MB 38.8MB/s eta 0:00:11   31% |██████████                      | 181.5MB 52.6MB/s eta 0:00:08   31% |██████████▏                     | 184.1MB 46.7MB/s eta 0:00:09       | 186.5MB 57.4MB/s eta 0:00:07��███▍                     | 189.0MB 51.0MB/s eta 0:00:08       | 191.1MB 42.7MB/s eta 0:00:10       | 193.7MB 35.7MB/s eta 0:00:11       | 196.0MB 50.7MB/s eta 0:00:08           | 199.2MB 47.6MB/s eta 0:00:09% |███████████                     | 201.7MB 52.7MB/s eta 0:00:08��████████▏                    | 204.2MB 37.3MB/s eta 0:00:11��████████▍                    | 206.8MB 54.9MB/s eta 0:00:07██▌                    | 208.9MB 48.3MB/s eta 0:00:08��████████▋                    | 211.4MB 46.1MB/s eta 0:00:09��████████▊                    | 213.8MB 46.0MB/s eta 0:00:095.9MB/s eta 0:00:15��█████████                    | 217.6MB 52.6MB/s eta 0:00:07��█████████                    | 219.0MB 28.5MB/s eta 0:00:1348.8MB/s eta 0:00:0859.6MB/s eta 0:00:0754.3MB/s eta 0:00:0755.5MB/s eta 0:00:0747.1MB/s eta 0:00:0832.9MB/s eta 0:00:1155.2MB/s eta 0:00:07ta 0:00:10███▏                  | 240.4MB 52.5MB/s eta 0:00:07███▎                  | 242.3MB 49.9MB/s eta 0:00:07███▌                  | 244.8MB 57.3MB/s eta 0:00:06███▋                  | 246.9MB 47.8MB/s eta 0:00:08███▊                  | 249.1MB 54.1MB/s eta 0:00:077MB/s eta 0:00:06████                  | 256.5MB 55.9MB/s eta 0:00:06�█████████████▎                 | 258.9MB 52.6MB/s eta 0:00:07   44% |██████████████▍                 | 261.5MB 50.0MB/s eta 0:00:07��███████████▌                 | 264.2MB 47.3MB/s eta 0:00:07   45% |██████████████▋                 | 266.2MB 52.8MB/s eta 0:00:06   46% |██████████████▊                 | 268.4MB 47.3MB/s eta 0:00:07   46% |██████████████▉                 | 271.0MB 49.6MB/s eta 0:00:07   46% |███████████████                 | 272.9MB 47.7MB/s eta 0:00:07   47% |███████████████                 | 274.9MB 56.1MB/s eta 0:00:06   | 276.8MB 30.8MB/s eta 0:00:100:00:06   | 280.8MB 54.4MB/s eta 0:00:06   | 282.9MB 59.3MB/s eta 0:00:06��█████▋                | 284.5MB 29.7MB/s eta 0:00:11��█████▊                | 286.9MB 53.3MB/s eta 0:00:06MB 44.3MB/s eta 0:00:07��██████                | 291.5MB 48.9MB/s eta 0:00:06��███████▏               | 293.6MB 50.5MB/s eta 0:00:06   50% |████████████████▎               | 295.9MB 60.2MB/s eta 0:00:05��███████▍               | 298.3MB 54.3MB/s eta 0:00:06   51% |████████████████▌               | 300.8MB 42.0MB/s eta 0:00:07��███████▋               | 302.8MB 49.7MB/s eta 0:00:06��███████▊               | 305.3MB 65.7MB/s eta 0:00:05�████▉               | 306.3MB 46.4MB/s eta 0:00:06   52% |█████████████████               | 307.9MB 29.9MB/s eta 0:00:10��████████               | 310.2MB 62.2MB/s eta 0:00:05    53% |█████████████████▏              | 312.2MB 55.8MB/s eta 0:00:05[K    53% |█████████████████▎              | 314.5MB 57.0MB/s eta 0:00:05[K    54% |█████████████████▍              | 316.8MB 55.1MB/s eta 0:00:05    54% |█████████████████▌              | 318.9MB 53.9MB/s eta 0:00:05[K    55% |█████████████████▋              | 321.0MB 46.9MB/s eta 0:00:06[K    55% |█████████████████▉              | 323.7MB 27.2MB/s eta 0:00:10[K    55% |██████████████████              | 325.9MB 48.0MB/s eta 0:00:06  56% |██████████████████              | 327.6MB 35.3MB/s eta 0:00:08    56% |██████████████████              | 329.6MB 40.7MB/s eta 0:00:07    | 332.0MB 31.3MB/s eta 0:00:09�███████▎             | 333.7MB 52.5MB/s eta 0:00:05    | 338.6MB 50.1MB/s eta 0:00:05    | 340.6MB 53.2MB/s eta 0:00:05    | 342.5MB 55.5MB/s eta 0:00:05    | 345.2MB 65.6MB/s eta 0:00:04    | 347.0MB 58.6MB/s eta 0:00:05�████████▏            | 349.0MB 43.2MB/s eta 0:00:06�████████▎            | 351.0MB 42.4MB/s eta 0:00:06�████████▍            | 353.6MB 51.5MB/s eta 0:00:05██████████▌            | 355.7MB 50.1MB/s eta 0:00:05.2MB 38.6MB/s eta 0:00:06██████████▉            | 360.5MB 52.1MB/s eta 0:00:05.4MB 38.9MB/s eta 0:00:06███████████            | 364.7MB 50.0MB/s eta 0:00:05█████████████████▏           | 366.8MB 54.5MB/s eta 0:00:04 |████████████████████▎           | 368.6MB 55.8MB/s eta 0:00:04 |████████████████████▍           | 371.0MB 53.7MB/s eta 0:00:04█████████████████▌           | 372.8MB 53.3MB/s eta 0:00:04 |████████████████████▊           | 376.4MB 52.8MB/s eta 0:00:04 |████████████████████▉           | 378.9MB 54.4MB/s eta 0:00:04 |█████████████████████           | 381.5MB 50.3MB/s eta 0:00:04��██████████           | 383.3MB 49.9MB/s eta 0:00:04MB 50.3MB/s eta 0:00:04MB 50.7MB/s eta 0:00:04█▌          | 390.7MB 48.2MB/s eta 0:00:04MB 53.8MB/s eta 0:00:04��████████▊          | 395.6MB 52.0MB/s eta 0:00:04    68% |█████████████████████▉          | 397.9MB 24.2MB/s eta 0:00:08MB 54.0MB/s eta 0:00:04   69% |██████████████████████▏         | 402.6MB 41.0MB/s eta 0:00:05��██▎         | 404.6MB 50.4MB/s eta 0:00:04��██▎         | 406.5MB 30.9MB/s eta 0:00:06█████▌         | 408.8MB 49.4MB/s eta 0:00:04█████▋         | 411.4MB 54.5MB/s eta 0:00:04 70% |██████████████████████▊         | 413.3MB 46.6MB/s eta 0:00:04█████▉         | 416.3MB 42.2MB/s eta 0:00:04██████         | 418.2MB 43.7MB/s eta 0:00:04██████         | 420.1MB 51.8MB/s eta 0:00:04��████████████████▏        | 422.2MB 42.7MB/s eta 0:00:04██████▎        | 423.9MB 53.6MB/s eta 0:00:03��████████████████▌        | 428.0MB 31.7MB/s eta 0:00:05��████████████████▋        | 429.7MB 38.8MB/s eta 0:00:04��████████████████▊        | 431.8MB 39.7MB/s eta 0:00:04��████████████████▉        | 433.8MB 63.0MB/s eta 0:00:03��█████████████████        | 436.2MB 50.8MB/s eta 0:00:03��█████████████████        | 438.7MB 64.5MB/s eta 0:00:0375% |████████████████████████▏       | 439.3MB 45.9MB/s eta 0:00:04  | 460.3MB 48.5MB/s eta 0:00:03  | 462.2MB 46.5MB/s eta 0:00:03███████████████████████▌      | 463.4MB 49.5MB/s eta 0:00:03  | 465.4MB 50.2MB/s eta 0:00:03B 65.1MB/s eta 0:00:02  | 470.4MB 43.5MB/s eta 0:00:03  | 472.4MB 61.0MB/s eta 0:00:02  | 474.6MB 53.3MB/s eta 0:00:03███████▎     | 478.6MB 32.2MB/s eta 0:00:04███████▍     | 480.7MB 50.1MB/s eta 0:00:03�███████▌     | 482.7MB 53.6MB/s eta 0:00:02  83% |██████████████████████████▋     | 484.6MB 49.3MB/s eta 0:00:02��████████▊     | 486.8MB 40.0MB/s eta 0:00:03�█████████     | 490.3MB 51.3MB/s eta 0:00:02  84% |███████████████████████████     | 492.2MB 64.1MB/s eta 0:00:02�███████     | 493.4MB 43.6MB/s eta 0:00:03��███████████████████▏    | 495.2MB 39.0MB/s eta 0:00:037.4MB 45.6MB/s eta 0:00:02��████████████████▌    | 499.6MB 55.6MB/s eta 0:00:02��████████████████▌    | 500.9MB 27.4MB/s eta 0:00:03��███████████████████▋    | 502.6MB 50.1MB/s eta 0:00:024.5MB 49.8MB/s eta 0:00:02��████████████████████    | 508.2MB 44.4MB/s eta 0:00:02��████████████████████    | 510.8MB 65.1MB/s eta 0:00:02��█████    | 511.4MB 41.8MB/s eta 0:00:02   88% |████████████████████████████▏   | 513.2MB 45.8MB/s eta 0:00:02   88% |████████████████████████████▎   | 515.1MB 41.0MB/s eta 0:00:02   88% |████████████████████████████▍   | 517.0MB 45.4MB/s eta 0:00:02   89% |████████████████████████████▌   | 518.8MB 28.0MB/s eta 0:00:03   89% |████████████████████████████▋   | 520.6MB 49.4MB/s eta 0:00:02�███████████████████████████▊   | 522.4MB 50.3MB/s eta 0:00:02% |████████████████████████████▉   | 524.2MB 52.5MB/s eta 0:00:02   90% |█████████████████████████████   | 526.4MB 52.9MB/s eta 0:00:02   90% |█████████████████████████████   | 528.4MB 58.4MB/s eta 0:00:01.9MB 38.7MB/s eta 0:00:02.5MB 57.5MB/s eta 0:00:01.0MB 46.4MB/s eta 0:00:02.8MB 43.4MB/s eta 0:00:01.1MB 30.6MB/s eta 0:00:02.6MB 50.7MB/s eta 0:00:01.4MB 61.6MB/s eta 0:00:01.8MB 26.5MB/s eta 0:00:02███████▏ | 549.1MB 27.2MB/s eta 0:00:02███████▎ | 551.0MB 46.3MB/s eta 0:00:01███████▍ | 552.3MB 31.1MB/s eta 0:00:01███████▍ | 553.7MB 48.2MB/s eta 0:00:01555.6MB 50.1MB/s eta 0:00:01�██████████████████████▌ | 556.0MB 35.2MB/s eta 0:00:01███████▋ | 558.0MB 52.8MB/s eta 0:00:01�█████████████████████████▊ | 559.7MB 44.6MB/s eta 0:00:01███████▉ | 561.7MB 51.1MB/s eta 0:00:01████████ | 563.7MB 50.5MB/s eta 0:00:01�██████████████████████████ | 565.2MB 38.1MB/s eta 0:00:01�█████████████████▏| 566.9MB 52.1MB/s eta 0:00:01�█████████████████▎| 568.5MB 49.7MB/s eta 0:00:01��███████████████████████████▍| 570.4MB 40.7MB/s eta 0:00:01�█████████████████▌| 572.5MB 55.1MB/s eta 0:00:01�█████████████████▌| 574.0MB 47.3MB/s eta 0:00:01�| 575.8MB 47.8MB/s eta 0:00:01�█████████████████▊| 576.6MB 51.2MB/s eta 0:00:01�█████████████████▉| 578.6MB 49.6MB/s eta 0:00:01�██████████████████| 581.9MB 66.2MB/s eta 0:00:01\n",
      "\u001b[?25hCollecting torchvision\n",
      "\u001b[?25l  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/fb/01/03fd7e503c16b3dc262483e5555ad40974ab5da8b9879e164b56c1f4ef6f/torchvision-0.2.2.post3-py2.py3-none-any.whl (64kB)\n",
      "\u001b[K    100% |████████████████████████████████| 71kB 15.7MB/s ta 0:00:01\n",
      "\u001b[?25hRequirement already satisfied: pillow>=4.1.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.5/site-packages (from torchvision) (5.3.0)\n",
      "Requirement already satisfied: numpy in /opt/conda/envs/python35-paddle120-env/lib/python3.5/site-packages (from torchvision) (1.15.4)\n",
      "Requirement already satisfied: six in /opt/conda/envs/python35-paddle120-env/lib/python3.5/site-packages (from torchvision) (1.12.0)\n",
      "Installing collected packages: torch, torchvision\n",
      "Successfully installed torch-1.0.1.post2 torchvision-0.2.2.post3\n"
     ]
    }
   ],
   "source": [
    "!pip install torch torchvision"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "#导入包\r\n",
    "import os\r\n",
    "import numpy as np\r\n",
    "import math\r\n",
    "\r\n",
    "import torchvision.transforms as transforms\r\n",
    "from torchvision.utils import save_image\r\n",
    "\r\n",
    "from torch.utils.data import DataLoader\r\n",
    "from torchvision import datasets\r\n",
    "from torch.autograd import Variable\r\n",
    "\r\n",
    "import torch.nn as nn\r\n",
    "import torch.nn.functional as F\r\n",
    "import torch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "784\n"
     ]
    }
   ],
   "source": [
    "#图片大小 （没有颜色 3->1）\n",
    "img_shape = (1, 28, 28)\n",
    "print(int(np.prod(img_shape)))\n",
    "#是否支持GPU\n",
    "cuda = True if torch.cuda.is_available() else False\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "#生成器模型\r\n",
    "class Generator(nn.Module):\r\n",
    "    #卷积层\r\n",
    "    def block(self,in_feat, out_feat, normalize=True):\r\n",
    "        layers = [nn.Linear(in_feat, out_feat)]\r\n",
    "        if normalize:\r\n",
    "            layers.append(nn.BatchNorm1d(out_feat, 0.8))\r\n",
    "        layers.append(nn.LeakyReLU(0.2, inplace=True))\r\n",
    "        return layers\r\n",
    "    def __init__(self):\r\n",
    "        super(Generator, self).__init__()\r\n",
    "\r\n",
    "        \r\n",
    "\r\n",
    "        self.model = nn.Sequential(\r\n",
    "            #输入100维  （不用*号就要使用concat连接block生成的List了）\r\n",
    "            *self.block(100, 128, normalize=False),\r\n",
    "            *self.block(128, 256),\r\n",
    "            *self.block(256, 512),\r\n",
    "            *self.block(512, 1024),\r\n",
    "            nn.Linear(1024, int(np.prod(img_shape))),\r\n",
    "            nn.Tanh()\r\n",
    "        )\r\n",
    "\r\n",
    "    def forward(self, z):\r\n",
    "        img = self.model(z)\r\n",
    "        #拓展为 1*28*28 \r\n",
    "        img = img.view(img.size(0), *img_shape)\r\n",
    "        return img\r\n",
    "#解码器模型\r\n",
    "class Discriminator(nn.Module):\r\n",
    "    def __init__(self):\r\n",
    "        super(Discriminator, self).__init__()\r\n",
    "\r\n",
    "        self.model = nn.Sequential(\r\n",
    "            nn.Linear(int(np.prod(img_shape)), 512),\r\n",
    "            nn.LeakyReLU(0.2, inplace=True),\r\n",
    "            nn.Linear(512, 256),\r\n",
    "            nn.LeakyReLU(0.2, inplace=True),\r\n",
    "            nn.Linear(256, 1),\r\n",
    "            nn.Sigmoid()\r\n",
    "        )\r\n",
    "\r\n",
    "    def forward(self, img):\r\n",
    "        #压平为1维张量\r\n",
    "        img_flat = img.view(img.size(0), -1)\r\n",
    "        validity = self.model(img_flat)\r\n",
    "\r\n",
    "        return validity\r\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "#初始化模型和损失函数\r\n",
    "# Loss function（用于多标签损失）\r\n",
    "adversarial_loss = torch.nn.BCELoss()\r\n",
    "\r\n",
    "# Initialize generator and discriminator\r\n",
    "generator = Generator()\r\n",
    "discriminator = Discriminator()\r\n",
    "\r\n",
    "if cuda:\r\n",
    "    generator.cuda()\r\n",
    "    discriminator.cuda()\r\n",
    "    adversarial_loss.cuda()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# Optimizers(优化器)\r\n",
    "lr=0.002\r\n",
    "b1=0.5\r\n",
    "b2=0.999\r\n",
    "optimizer_G = torch.optim.Adam(generator.parameters(), lr=lr, betas=(b1, b2))\r\n",
    "optimizer_D = torch.optim.Adam(discriminator.parameters(), lr=lr, betas=(b1, b2))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "#数据加载\r\n",
    "def changeshape(v):\r\n",
    "    print(shape(v))\r\n",
    "    return v.view(1,28,28).reshape(3,28,28)\r\n",
    "dataloader = torch.utils.data.DataLoader(\r\n",
    "    datasets.MNIST('data', train=True, download=True,\r\n",
    "                   transform=transforms.Compose([\r\n",
    "                       transforms.ToTensor()#,黑白图片不需要\r\n",
    "                       #transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))\r\n",
    "                   ])),\r\n",
    "    batch_size=64, shuffle=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "#张量类型\n",
    "Tensor = torch.cuda.FloatTensor if cuda else torch.FloatTensor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Epoch 0/10000] [Batch 0/938] [D loss: 0.624057] [G loss: 0.344255]\n",
      "[Epoch 0/10000] [Batch 1/938] [D loss: 0.671759] [G loss: 0.323223]\n",
      "[Epoch 0/10000] [Batch 2/938] [D loss: 0.394597] [G loss: 0.903681]\n",
      "[Epoch 0/10000] [Batch 3/938] [D loss: 0.326520] [G loss: 2.083231]\n",
      "[Epoch 0/10000] [Batch 4/938] [D loss: 0.638477] [G loss: 0.348816]\n",
      "[Epoch 0/10000] [Batch 5/938] [D loss: 0.394623] [G loss: 1.120606]\n",
      "[Epoch 0/10000] [Batch 6/938] [D loss: 0.679580] [G loss: 0.617310]\n",
      "[Epoch 0/10000] [Batch 7/938] [D loss: 0.647283] [G loss: 0.525667]\n",
      "[Epoch 0/10000] [Batch 8/938] [D loss: 0.452362] [G loss: 3.203564]\n",
      "[Epoch 0/10000] [Batch 9/938] [D loss: 0.516118] [G loss: 0.467275]\n",
      "[Epoch 0/10000] [Batch 10/938] [D loss: 0.127384] [G loss: 1.739956]\n",
      "[Epoch 0/10000] [Batch 11/938] [D loss: 0.121971] [G loss: 1.778823]\n",
      "[Epoch 0/10000] [Batch 12/938] [D loss: 0.262932] [G loss: 1.034995]\n",
      "[Epoch 0/10000] [Batch 13/938] [D loss: 0.431825] [G loss: 0.592521]\n",
      "[Epoch 0/10000] [Batch 14/938] [D loss: 0.441085] [G loss: 0.551847]\n",
      "[Epoch 0/10000] [Batch 15/938] [D loss: 0.406896] [G loss: 0.602710]\n",
      "[Epoch 0/10000] [Batch 16/938] [D loss: 0.349439] [G loss: 0.703444]\n",
      "[Epoch 0/10000] [Batch 17/938] [D loss: 0.291268] [G loss: 0.835324]\n",
      "[Epoch 0/10000] [Batch 18/938] [D loss: 0.212214] [G loss: 1.083404]\n",
      "[Epoch 0/10000] [Batch 19/938] [D loss: 0.129443] [G loss: 1.519735]\n",
      "[Epoch 0/10000] [Batch 20/938] [D loss: 0.073820] [G loss: 2.041428]\n",
      "[Epoch 0/10000] [Batch 21/938] [D loss: 0.063038] [G loss: 2.226605]\n",
      "[Epoch 0/10000] [Batch 22/938] [D loss: 0.120082] [G loss: 1.657621]\n",
      "[Epoch 0/10000] [Batch 23/938] [D loss: 0.566445] [G loss: 0.501756]\n",
      "[Epoch 0/10000] [Batch 24/938] [D loss: 1.119097] [G loss: 0.897002]\n",
      "[Epoch 0/10000] [Batch 25/938] [D loss: 1.570459] [G loss: 0.044501]\n",
      "[Epoch 0/10000] [Batch 26/938] [D loss: 0.356076] [G loss: 0.697667]\n"
     ]
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\r\n",
    "plt.ion()\r\n",
    "from PIL import Image\r\n",
    "def imshow(tensor, title=None):\r\n",
    "    image = tensor.clone().cpu()  # we clone the tensor to not do changes on it\r\n",
    "    image = image.view(1, 28, 28)  # remove the fake batch dimension\r\n",
    "    image = unloader(image)\r\n",
    "    plt.imshow(image)\r\n",
    "    if title is not None:\r\n",
    "        plt.title(title)\r\n",
    "    plt.pause(0.001) # pause a bit so that plots are updated\r\n",
    "# ----------\r\n",
    "#  Training\r\n",
    "# ----------\r\n",
    "\r\n",
    "for epoch in range(10000):\r\n",
    "    for i, (imgs, _) in enumerate(dataloader):\r\n",
    "\r\n",
    "        # Adversarial ground truths\r\n",
    "        valid = Variable(Tensor(imgs.size(0), 1).fill_(1.0), requires_grad=False)\r\n",
    "        fake = Variable(Tensor(imgs.size(0), 1).fill_(0.0), requires_grad=False)\r\n",
    "\r\n",
    "        # Configure input\r\n",
    "        real_imgs = Variable(imgs.type(Tensor))\r\n",
    "\r\n",
    "        # -----------------\r\n",
    "        #  Train Generator\r\n",
    "        # -----------------\r\n",
    "\r\n",
    "        optimizer_G.zero_grad()\r\n",
    "\r\n",
    "        # Sample noise as generator input\r\n",
    "        z = Variable(Tensor(np.random.normal(0, 1, (imgs.shape[0], 100))))\r\n",
    "\r\n",
    "        # Generate a batch of images\r\n",
    "        gen_imgs = generator(z)\r\n",
    "\r\n",
    "        # Loss measures generator's ability to fool the discriminator\r\n",
    "        g_loss = adversarial_loss(discriminator(gen_imgs), valid)\r\n",
    "\r\n",
    "        g_loss.backward()\r\n",
    "        optimizer_G.step()\r\n",
    "\r\n",
    "        # ---------------------\r\n",
    "        #  Train Discriminator\r\n",
    "        # ---------------------\r\n",
    "\r\n",
    "        optimizer_D.zero_grad()\r\n",
    "\r\n",
    "        # Measure discriminator's ability to classify real from generated samples\r\n",
    "        real_loss = adversarial_loss(discriminator(real_imgs), valid)\r\n",
    "        fake_loss = adversarial_loss(discriminator(gen_imgs.detach()), fake)\r\n",
    "        d_loss = (real_loss + fake_loss) / 2\r\n",
    "\r\n",
    "        d_loss.backward()\r\n",
    "        optimizer_D.step()\r\n",
    "\r\n",
    "        print (\"[Epoch %d/%d] [Batch %d/%d] [D loss: %f] [G loss: %f]\" % (epoch, 10000, i, len(dataloader),\r\n",
    "                                                            d_loss.item(), g_loss.item()))\r\n",
    "\r\n",
    "        batches_done = epoch * len(dataloader) + i\r\n",
    "        if batches_done % 50 == 0:\r\n",
    "            save_image(gen_imgs.data[:25], 'images/%d.png' % batches_done, nrow=5, normalize=True)\r\n",
    "            #imshow(gen_imgs.data[:25] ,title=\"生成图片\")\r\n",
    "            "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "PaddlePaddle 1.2.0 (Python 3.5)",
   "language": "python",
   "name": "py35-paddle1.2.0"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
